﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Arrayies
{
    class Program
    {
        static void Main(string[] args)
        {
            //_________________________________________________________________Метод Main с выбором задания

            string finalChoice;
            do
            {
                Console.Clear();
                Console.WriteLine(@"Пожалуйста, укажите номер приложения, которое хотите запустить:
1 - Поиск максимального значения элементов массива;
3 - Поиск минимального элемента массива и количество значений отличных от минимального на 5;
3 - Сумма всех элементов массива, стоящих до максимального значения;
4 - Поиск значения последнего отрицательного элемента массива и его индекс;
5 - Поиск максимального значения массива. Замена последующих элементов на среднее арифметическое. Вывод обновленного массива.");
                Console.Write("Задание # ");
                //int varChoice = Int32.Parse(Console.ReadLine());
                int varChoice;
                bool incorChoice = Int32.TryParse(Console.ReadLine(), out varChoice);
                switch (varChoice)
                {
                    case 1:
                        maxElementInArray();
                        break;
                    case 2:
                        countOfElementsGraterLessToFive();
                        break;
                    case 3:
                        sumOfElementsTillMaxValue();
                        break;
                    case 4:
                        placeAndValueOfNegativeElement();
                        break;
                    case 5:
                        everageAfterMaxValue();
                        break;
                    default:
                        if (incorChoice == false || varChoice <= 0)
                        {
                            Console.WriteLine("Некорректный ввод!");
                        }
                        else
                        {
                            Console.WriteLine("Выбран несуществующий вариант!");
                        }
                        break;
                }
                Console.WriteLine("\nЖелаете повторить выбор задания? Y - Да, N - нет.");
                do
                {
                    finalChoice = Console.ReadLine();
                    if (finalChoice != "Y" && finalChoice != "N")
                    {
                        Console.WriteLine("Некорректный ввод! Введите Y или N.");
                    }
                } while (finalChoice != "Y" && finalChoice != "N");
            } while (finalChoice == "Y");
            Console.WriteLine("\nСпасибо за внимание. До свидания!");
        }

        //_________________________________________________________________Метод ввода значений элементов массива

        static int[] fillArrayFromConsole(int arraySize)
        {
            int[] array = new int[arraySize];
            for (int i = 0; i < arraySize; i++)
            {
                Console.Write("[{0}]: ", i);
                array[i] = Int32.Parse(Console.ReadLine());
            }
            return array;
        }

        //_________________________________________________________________Метод вывода массива на экран 

        static void outputArrayToDisplay(int[] arrayToPrint)
        {
            Console.Write("Массив: {");
            foreach (int number in arrayToPrint)
            {
                Console.Write("{0} ", number);
            }
            Console.Write("}");
        }

        //_________________________________________________________________Задание 1

        static void maxElementInArray()
        {
            int maxNumber = Int32.MinValue;
            int i = 0;
            Console.WriteLine("Enter the value of array: ");

            int[] maxArray = fillArrayFromConsole(5);
            for (i = 0; i < maxArray.Length; i++)
            {

                if (maxArray[i] == 0)
                {
                    maxNumber = maxArray[i];
                }
                else if (maxArray[i] > maxNumber)
                {
                    maxNumber = maxArray[i];
                }
                else
                {
                    continue;
                }
            }

            outputArrayToDisplay(maxArray);
            Console.WriteLine("\nМаксималное число: " + maxNumber);

        }

        //_________________________________________________________________Задание 2

        static void countOfElementsGraterLessToFive()
        {
            Console.WriteLine("Enter the size of array: ");
            int size = Int32.Parse(Console.ReadLine());
            int minNumber = Int32.MaxValue;
            int elementToFind = 0;
            int i = 0;
            Console.WriteLine("Enter the value of array: ");
            int[] minArray = fillArrayFromConsole(size);
            for (i = 0; i < minArray.Length; i++)
            {
                if (minArray[i] == 0)
                {
                    minNumber = minArray[i];
                }
                else if (minArray[i] < minNumber)
                {
                    minNumber = minArray[i];
                }
                else
                {
                    continue;
                }
            }
            outputArrayToDisplay(minArray);

            Console.WriteLine("\nМинимальное число {0}: ", minNumber);

            for (i = 0; i < minArray.Length; i++)
            {
                if (minArray[i] == (minNumber + 5) || minArray[i] == (minNumber - 5))
                {
                    elementToFind = ++elementToFind;
                }
            }
            Console.WriteLine("Count of number differ from min value to 5: {0}", elementToFind);
        }

        //_________________________________________________________________Задание 3

        static void sumOfElementsTillMaxValue()
        {
            Console.WriteLine("Enter the size of array: ");
            int size = Int32.Parse(Console.ReadLine());
            int sumOfElements = 0;
            int maxNumber = Int32.MinValue;
            int i = 0;

            Console.WriteLine("Enter the value of array: ");
            int[] sumArray = fillArrayFromConsole(size);
            for (i = 0; i < sumArray.Length; i++)
            {
                if (sumArray[i] == 0)
                {
                    maxNumber = sumArray[i];
                }
                else if (sumArray[i] > maxNumber)
                {
                    maxNumber = sumArray[i];
                }
                else
                {
                    continue;
                }
            }
            outputArrayToDisplay(sumArray);
            Console.WriteLine("\nMax Value: " + maxNumber);
            int first = Array.IndexOf(sumArray, maxNumber);

            for (i = 0; i < first; i++)
            {
                if (sumArray[0] == maxNumber)
                {
                    sumOfElements = 0;
                }
                else
                {
                    sumOfElements += sumArray[i];
                }
            }
            Console.WriteLine("The summ of elements till the first appearence of Max Value: {0}", sumOfElements);

        }

        //_________________________________________________________________Задание 4

        static void placeAndValueOfNegativeElement()
        {
            Console.WriteLine("Enter the value of array: ");
            int[] negativeArray = fillArrayFromConsole(8);
            int i;
            int lastNegative = 0;
            int indxOfLastNegative = 0;
            int countNegative = 0;

            for (i = 0; i < negativeArray.Length; i++)
            {
                if (negativeArray[i] < 0)
                {
                    lastNegative = negativeArray[i];
                    indxOfLastNegative = i;
                    countNegative++;
                }
                else
                {
                    continue;
                }
            }
            outputArrayToDisplay(negativeArray);
            if (countNegative == 0)
            {
                Console.WriteLine("\nThere is no negative values in the array.");
            }
            else
            {
                Console.WriteLine("\nThe value of the last negative element in the array is: {0}, it has index: {1} ", lastNegative, indxOfLastNegative);
            }
        }

        //_________________________________________________________________Задание 5

        static void everageAfterMaxValue()
        {
            Console.WriteLine("Enter the size of array: ");
            int sizeOfArray = Int32.Parse(Console.ReadLine());
            double everageOfElements = 0;
            int maxValue = Int32.MinValue;
            int i = 0;
            int[] initialArray = fillArrayFromConsole(sizeOfArray);
            double[] finalArray = new double[sizeOfArray];
            Array.Copy(initialArray, finalArray, initialArray.Length); // Copying from initial array to new 'double' array
            maxValue = initialArray.Max();
            everageOfElements = (double)initialArray.Sum() / initialArray.Length;
            int indxOfMaxValue = Array.IndexOf(initialArray, maxValue);
            for (i = indxOfMaxValue + 1; i < initialArray.Length; i++)
            {
                finalArray[i] = everageOfElements;
            }
            outputArrayToDisplay(initialArray);
            Console.Write(" - Initial array.");
            Console.WriteLine("\nMax Value: " + maxValue);

            Console.Write("Массив: {");
            foreach (double number in finalArray)
            {
                Console.Write("{0:#.#} ", number);
            }
            Console.Write("} - Final array.");
        }

    }
}


